/**
 * 易宝收银台拉起工具 APP

 */


export type MiniProgramEnv = 'release' | 'trial' | 'develop'

export interface YeepayCashierOptions {
  /**
   * H5 收银台地址（强烈建议提供，作为任意平台的最终兜底）
   * 例如：后端返回的易宝 H5 收银台直跳 URL（带签名参数）。
   */
  h5CashierUrl?: string

  /**
   * 微信 H5（微信内置浏览器）可选的专用地址；若不提供将使用 h5CashierUrl。
   */
  wechatH5Url?: string

  /** 易宝收银台小程序的 appId（形如 wx******） */
  mpAppId?: string
  /** 小程序路径（如：/pages/cashier/index），不含 query */
  mpPath?: string
  /** 小程序环境 */
  mpEnv?: MiniProgramEnv
  /** 小程序参数（会拼到 path 的 query 中） */
  mpQuery?: Record<string, string | number | boolean>

  /**
   * APP 端无法拉起小程序时，是否在应用内 WebView 打开 H5 收银台（默认 true）。
   * 若为 false，则改为调用系统浏览器打开。
   */
  openInAppWebview?: boolean

  /** 调试开关（仅控制本工具内部 console 输出） */
  debug?: boolean
}

/**
 * APP 端尝试拉起微信小程序（若失败则返回 false）
 * 说明：依赖 5+ Runtime 的微信分享服务；不同端兼容字段为 userName 或 id。
 */
async function tryOpenMpOnApp(options: YeepayCashierOptions): Promise<boolean> {
  const { mpAppId, mpPath, mpEnv, debug } = options
  // #ifdef APP-PLUS
  const g: any = (globalThis as any)
  const plusObj = g?.plus
  if (!plusObj) return false

  if (!mpAppId) return false
  const fullPath = mpPath

  const envToType = (env?: MiniProgramEnv): number => {
    // 0: 正式版 1: 开发版 2: 体验版
    if (env === 'develop') return 1
    if (env === 'trial') return 2
    return 0
  }

  const type = envToType(mpEnv)
  if (debug) console.log('[YeePay] APP 尝试拉起小程序', { mpAppId, fullPath, type })

  // 通过微信分享服务拉起小程序
  const svc = await new Promise<any>((resolve) => {
    try {
      plusObj.share.getServices((svcs: any[]) => {
        const wx = svcs?.find((s: any) => s?.id === 'weixin')
        resolve(wx)
      }, () => resolve(null))
    } catch (e) {
      if (debug) console.warn('[YeePay] 获取分享服务失败', e)
      resolve(null)
    }
  })
  if (!svc || typeof svc.launchMiniProgram !== 'function') {
    if (debug) console.warn('[YeePay] 未找到微信小程序拉起能力，降级')
    return false
  }

  // 兼容不同字段：userName / id / appid
  const payloads = [
    // { userName: mpAppId, path: fullPath,type },
    { id: mpAppId, path: fullPath, type },
    // { appid: mpAppId, path: fullPath, type },
  ]

  for (const p of payloads) {
    try {
      await new Promise<void>((resolve, reject) => {
        svc.launchMiniProgram(p, () =>{
          resolve();
        }, (err: any) => reject(err))
      })
      if (debug) console.log('[YeePay] 已拉起微信小程序')
      return true
    } catch (e) {
      if (debug) console.warn('[YeePay] 拉起失败，尝试下一种参数', p, e)
      // 尝试下一种参数
    }
  }
  return false
  // #endif
  return false
}

// （移除）APP 内浏览器打开 URL：已无需兜底到 H5 收银台

/**
 * 拉起易宝收银台小程序
 * @param options 见 YeepayCashierOptions
 */
export async function openYeepayCashier(options: YeepayCashierOptions): Promise<void> {
  const opts: YeepayCashierOptions = {
    openInAppWebview: true,
    mpEnv: 'release',
    debug: false,
    ...options,
  }

  if (!opts.mpAppId) throw new Error('缺少 mpAppId，无法拉起微信小程序')
  // APP 端：通过微信分享服务拉起小程序
  const ok = await tryOpenMpOnApp(opts)
  if (ok) return
  throw new Error('APP 端拉起微信小程序失败')

}

export default {
  openYeepayCashier,
}
